﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OWLServer.owl.excepciones;

namespace OWLServer.owl.tipos
{
    /// <summary>
    /// Clase que representa una restricción vinculada a una propiedad de dato
    /// </summary>
    public class RestriccionPropiedadDato : Restriccion
    {
        private Propiedad propiedad;

        /// <summary>
        /// Propiedad sobre la que se va a definir la restricción.
        /// </summary>
        public virtual Propiedad Propiedad
        {
            get { return propiedad; }
            set { propiedad = value; }
        }

        /// <summary>
        /// Restricción que vamos a aplicar sobre una clase. Que afecta a una propiedad relacionadad con la misma.
        /// </summary>
        public RestriccionPropiedadDato(): base(){}

        /// <summary>
        /// Restricción que vamos a aplicar sobre una clase. Que afecta a una propiedad relacionadad con la misma.
        /// </summary>
        /// <param name="propiedad">Propiedad relacionada con la clase sobre la que se va a definir la restricción.</param>
        /// <param name="tipo">Tipo de restricción.</param>
        /// <param name="tipoPropiedadRelacionada">Tipo de propiedad a la que vamos a aplicar la restricción, dentro de la clase.</param>
        /// <param name="cardinalidad">Cardinalidad relacionada con la restriccion</param>
        public RestriccionPropiedadDato(Propiedad propiedad, TipoRestriccion tipo, TipoPropiedadRelacionada tipoPropiedadRelacionada, int cardinalidad)
            : base(tipo, tipoPropiedadRelacionada, cardinalidad)
        {
            Propiedad = propiedad;
        }

        /// <summary>
        /// Restricción que vamos a aplicar sobre una clase. Que afecta a una propiedad relacionadad con la misma.
        /// </summary>
        /// <param name="propiedad">Propiedad relacionada con la clase sobre la que se va a definir la restricción.</param>
        /// <param name="tipo">Tipo de restricción.</param>
        /// <param name="tipoPropiedadRelacionada">Tipo de propiedad a la que vamos a aplicar la restricción, dentro de la clase.</param>
        /// <param name="clase">Clase relacionada con la restriccion</param>
        public RestriccionPropiedadDato(Propiedad propiedad, TipoRestriccion tipo, TipoPropiedadRelacionada tipoPropiedadRelacionada, Clase clase)
            : base(tipo, tipoPropiedadRelacionada, clase)
        {
            Propiedad = propiedad;
        }

        /// <summary>
        /// Método ToString()
        /// </summary>
        /// <returns></returns>
        override public String ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("{");
            sb.Append(this.Propiedad);
            sb.Append(" ");
            sb.Append(this.Tipo);
            if (Tipo == TipoRestriccion.CARDINALIDAD
                || Tipo == TipoRestriccion.CARDINALIDAD_MAXIMA
                || Tipo == TipoRestriccion.CARDINALIDAD_MINIMA)
            {
                sb.Append(" (");
                sb.Append(this.Cardinalidad);
                sb.Append(") ");
            }
            sb.Append("}");

            return sb.ToString();
        }
    }
}
